#include <stdlib.h>
#include <string.h>
#include <stdio.h>



int myadd(int a, int b){ //子任务的实现者
        printf("myadd a + b = %d \n", a+b);
        return a+b;
}

int myadd2(int a, int b){ //子任务的实现者
        printf("myadd2 a + b = %d \n", a+b);
        return a+b;
}

int myadd3(int a, int b){ //子任务的实现者
        printf("myadd3 a + b = %d \n", a+b);
        return a+b;
}

int myadd4(int a, int b){ //子任务的实现者
        printf("myadd4 a + b = %d \n", a+b);
        return a+b;
}
//定义了一个类型
typedef int (MyTypeFuncAdd)(int a, int b);

//函数指针做函数参数
int MainOp(MyTypeFuncAdd myFuncAdd){
        return myFuncAdd(5, 6);
}

//函数指针做函数参数
int MainOp2(int (*myPointerFuncAdd)(int a, int b)){
        return myPointerFuncAdd(7, 8); //间接调用
}

//任务的调用 和 任务的编写 可以分开
int main(int argc, char const *argv[])
{
        MyTypeFuncAdd *myFuncAdd = NULL;
       
        myadd(1, 2);  //直接调用
        
        myFuncAdd = myadd;
        myFuncAdd(3, 4); //间接调用

        MainOp2(myadd);
        MainOp(myadd);

        //在MainOp框架 没有发生任何变化的情况下...给调用起来
        MainOp(myadd2);
        MainOp(myadd3);
        MainOp(myadd4);
        return 0;
}
